//
// CrackException
//
// Copyright (C) jextra.net.
//
//  This file is part of the Crack build system.
//
//  The Crack build system is free software; you can redistribute it 
//  and/or modify it under the terms of the GNU Lesser General Public
//  License as published by the Free Software Foundation; either
//  version 2.1 of the License, or (at your option) any later version.
//
//  The Crack build system is distributed in the hope that it will be 
//  useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
//  Lesser General Public License for more details.
//
//  You should have received a copy of the GNU Lesser General Public
//  License along with the Crack build system; if not, write to the Free
//  Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
//  02111-1307 USA.
//

package net.jextra.crack;

import java.io.*;

/**
 * <p>
 * A general use runtime exception from the Crack library.
 * </p>
 */
public class CrackException extends RuntimeException
{
    // ============================================================
    // Constructors
    // ============================================================

    public CrackException( String message )
    {
        super( message );
    }

    public CrackException( String message, Throwable ex )
    {
        super( message, ex );
    }

    public CrackException( Throwable ex )
    {
        initCause( ex );
    }

    // ============================================================
    // Methods
    // ============================================================

    // ----------
    // public
    // ----------

    /**
     * Overridden in order to avoid the default behaviour of short-changing the output and printing
     * ... X more.
     */
    @Override
    public void printStackTrace( PrintStream stream )
    {
        stream.println( getStackTrace( this ) );
    }

    /**
     * Overridden in order to avoid the default behaviour of short-changing the output and printing
     * ... X more.
     */
    @Override
    public void printStackTrace( PrintWriter stream )
    {
        stream.println( getStackTrace( this ) );
    }

    public static String getStackTrace( Throwable t )
    {
        StringBuffer buffer = new StringBuffer();
        buffer.append( t.toString() );
        buffer.append( "\n" );
        for ( StackTraceElement element : t.getStackTrace() )
        {
            buffer.append( "    " );
            buffer.append( element.toString() );
            buffer.append( "\n" );
        }

        if ( t.getCause() != null )
        {
            buffer.append( "Caused by: " );
            buffer.append( getStackTrace( t.getCause() ) );
        }

        return buffer.toString();
    }
}

